package com.csair.common;

import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.text.TextUtils;
import android.view.KeyEvent;

import com.csair.common.utils.AppUtils;
import com.csair.common.utils.LanguageUtil;
import com.csair.common.utils.LogUtils;
import com.csair.common.utils.bus.BusUtil;
import com.csair.common.utils.bus.Event;

import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;


/**
 * @author vaycent (vaycentsun@gmail.com)
 * @date 2018/6/6
 */

public abstract class CommonActivity extends AppCompatActivity {
    @Override
    protected void attachBaseContext(Context newBase) {
        super.attachBaseContext(LanguageUtil.refreshContext(newBase));
        LogUtils.i("CommonActivity",getClass().getName()+"attachBaseContext");
    }

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        AppUtils.setTranlucentStatus(this);// 设置状态栏为半透明
        LogUtils.i("CommonActivity",getClass().getName()+"onCreate");
        //View.post要成功就是在 attached to a window.之后,可以保证正常显示给用户后再post
        getWindow().getDecorView().post(() -> new Handler()
                .post(() -> onDelayLoad(savedInstanceState)));
        /**
         * 注册事件总线,目前使用Eventbus
         */
        if (this.getClass().isAnnotationPresent(BindBus.class)) {
            BusUtil.register(this);
        }



    }

    @Override
    protected void onStart(){
        super.onStart();
        LogUtils.i("CommonActivity",getClass().getName()+"onStart");
    }

    @Override
    protected void onResume(){
        super.onResume();
        LogUtils.i("CommonActivity",getClass().getName()+"onResume");
    }

    @Override
    protected void onPause(){
        super.onPause();
        LogUtils.i("CommonActivity",getClass().getName()+"onPause");
    }

    @Override
    protected void onStop(){
        super.onStop();
        LogUtils.i("CommonActivity",getClass().getName()+"onStop");
    }

    @Override
    protected void onDestroy(){
        super.onDestroy();
        LogUtils.i("CommonActivity",getClass().getName()+"onDestroy");
        /**
         * 注销事件总线,目前使用Eventbus
         */
        if (this.getClass().isAnnotationPresent(BindBus.class)) {
            BusUtil.unregister(this);
        }
    }

    @Override
    protected void onRestart(){
        super.onRestart();
        LogUtils.i("CommonActivity",getClass().getName()+"onRestart");
    }

    @Override
    protected void onNewIntent(Intent intent){
        super.onNewIntent(intent);
        LogUtils.i("CommonActivity",getClass().getName()+"onNewIntent");
    }


    /**********************************************/
    /**
     * 用于事件总线注解，BindBus
     */
    @Target(ElementType.TYPE)
    @Retention(RetentionPolicy.RUNTIME)
    public @interface BindBus {
    }
    /**
     * 主线程接收普通事件
     * @param event
     */
    @Subscribe(threadMode = ThreadMode.MAIN)
    public void onReceiveEventBus(Event event) {
        if (event != null) {
            receiveEvent(event);
        }
    }
    /**
     * 主线程接收粘性事件
     * @param event
     */
    @Subscribe(threadMode = ThreadMode.MAIN, sticky = true)
    public void onReceiveStickyEventBus(Event event) {
        if (event != null) {
            receiveStickyEvent(event);
        }
    }
    /**
     * @param event 事件
     */
    protected void receiveEvent(Event event) {
        LogUtils.i("CommonActivity",getClass().getName()+"receiveEvent");
        if(null==event||TextUtils.isEmpty(event.getAction())){
            return;
        }
    }
    /**
     * @param event 粘性事件
     */
    protected void receiveStickyEvent(Event event) {
        LogUtils.i("CommonActivity",getClass().getName()+"receiveStickyEvent");
        if(null==event||TextUtils.isEmpty(event.getAction())){
            return;
        }
    }
    /**********************************************/





    @Override
    public boolean onKeyUp(int keyCode, KeyEvent event) {
        LogUtils.i("CommonActivity",getClass().getName()+"onKeyUp");
        return super.onKeyUp(keyCode,event);
    }

    /**
     * 需要延迟加载的东西放到该方法中执行
     * 1、获取Intent数据耗时较短，并且会影响后续操作，应放在OnCreate方法中执行
     * 2、最基本的、保证用户体验的界面渲染应放在OnCreate方法中执行
     * 3、涉及数据库查询更改的操作耗时较长，应放在onDelayLoad中执行
     * 4、涉及列表加载、Adapter渲染的操作耗时较长，应放在onDelayLoad中执行
     * 5、控件的监听事件应保证所有界面加载好后再设置，防止异常发生，应放在onDelayLoad中执行
     * 6、其他未提及的耗时操作应视实际情况，尽可能地放在onDelayLoad中执行
     */
    protected void onDelayLoad(@Nullable Bundle savedInstanceState) {
        LogUtils.i("CommonActivity",getClass().getName()+"onDelayLoad");
    }

}
